package com.cmonbaby.adapter.recycleview;

import androidx.annotation.NonNull;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import com.cmonbaby.adapter.recycleview.base.BaseRViewAdapter;
import com.cmonbaby.adapter.recycleview.base.RItem;
import com.cmonbaby.adapter.recycleview.base.RItemManager;

import java.util.List;

/**
 * RecycleView多条目形式适配器
 * @author simon 2016-9-19 下午15:05:29
 * @since JDK1.8 SDK6.0.1
 * @version V2.3.4
 * @param <T>
 */
public class RMultiItemTypeAdapter<T> extends BaseRViewAdapter<T, RViewHolder> {

    private RItemManager<T> mRItemManager; // 条目管理
    private OnItemClickListener<T> mOnItemClickListener; // 条目点击事件监听
    private OnItemLongClickListener<T> mOnItemLongClickListener; // 条目长按事件监听
    private final static long QUICK_EVENT_TIME_SPAN = 300;
    private static long lastClickTime = 0;

    /**
     * 构造方法，其中初始化了条目管理：new RItemManager()
     * @param datas 数据源
     */
    public RMultiItemTypeAdapter(List<T> datas) {
        super(datas);
        mRItemManager = new RItemManager<>();
    }

    /** 是否使用item条目样式 */
    private boolean useItemViewDelegateManager() {
        return mRItemManager.getItemViewStylesCount() > 0;
    }

    /** 根据数据源的position返回需要显示的的layout的type，type的值必须从0开始 */
    @Override
    public int getItemViewType(int position) {
        if (useItemViewDelegateManager()) return mRItemManager.getItemViewType(super.mDatas.get(position), position);
        return super.getItemViewType(position);
    }

    /**
     * 为Item创建视图
     *
     * @param parent 父布局
     * @param viewType 需要的布局类型，比如有多种布局，拿出某种布局
     * @return RViewHolder
     */
    @NonNull
    @Override
    public RViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        RItem rItem = mRItemManager.getItemViewStyles(viewType);
        int layoutId = rItem.getItemViewLayoutId(); // 获取item条目布局ID
        // 获得RecycleViewViewHolder对象，其中使用构造方法实现
        RViewHolder holder = RViewHolder.createViewHolder(parent.getContext(), parent, layoutId);
        // 当视图创建，未做数据绑定时的回调，可重写实现
        onViewHolderCreated(holder, holder.getConvertView());
        // 设置条目监听事件
        setListener(holder);
        return holder;
    }

    /**
     * 当视图创建，未做数据绑定时的回调，可重写实现
     *
     * @param holder LViewHolder
     * @param itemView listViewViewHolder.getConvertView()
     */
    protected void onViewHolderCreated(RViewHolder holder, View itemView) {
    }

    /**
     * 视图与数据源绑定显示，有ViewHolder，T实体对象
     *
     * @param holder RViewHolder
     * @param item 数据源对象
     */
    protected void convert(RViewHolder holder, T item) {
        mRItemManager.convert(holder, item, holder.getAdapterPosition());
    }

    /**
     * 是否开启事件监听，默认开启，可以重写
     * @param rViewHolder 作为判断条件是否开启事件监听
     * @return true为开启
     */
    protected boolean isEnabled(RViewHolder rViewHolder) {
        return rViewHolder != null;
    }

    /**
     * 设置条目事件监听
     *
     * @param rViewHolder RecycleViewViewHolder对象
     */
    private void setListener(final RViewHolder rViewHolder) {
        if (!isEnabled(rViewHolder)) return;
        rViewHolder.getConvertView().setOnClickListener(v -> {
            if (mOnItemClickListener != null) {
                int position = rViewHolder.getAdapterPosition();
                if (position != -1) { // 防止连续点击同一条目而且是删除操作
                    long timeSpan = System.currentTimeMillis() - lastClickTime;
                    if (timeSpan < QUICK_EVENT_TIME_SPAN) { // 防止误点
                        Log.d("点击阻塞，防止误点: ", String.valueOf(timeSpan));
                        return;
                    }
                    lastClickTime = System.currentTimeMillis();
                    mOnItemClickListener.onItemClick(v, getItem(position), position);
                }
            }
        });

        rViewHolder.getConvertView().setOnLongClickListener(v -> {
            if (mOnItemLongClickListener != null) {
                int position = rViewHolder.getAdapterPosition();
                return mOnItemLongClickListener.onItemLongClick(v, getItem(position), position);
            }
            return false;
        });
    }

    /**
     * 将数据绑定到Item的视图上
     *
     * @param holder RViewHolder
     * @param position 条目位置，用于获得对应实体数据源
     */
    @Override
    public void onBindViewHolder(@NonNull RViewHolder holder, int position) {
        convert(holder, super.mDatas.get(position));
    }

    /** 绘制RecycleView之前，将会先调用getItemCount方法来获取Item的个数 */
    @Override
    public int getItemCount() {
        return super.mDatas == null ? 0 : super.mDatas.size();
    }

    /**
     * 增加一种item条目样式
     * @param rItem item条目对象
     * @return LMultiItemTypeAdapter
     */
    protected RMultiItemTypeAdapter addItemViewStyles(RItem<T> rItem) {
        mRItemManager.addStyles(rItem);
        return this;
    }

    protected RMultiItemTypeAdapter addItemViewStyles(int viewType, RItem<T> rItem) {
        mRItemManager.addStyles(viewType, rItem);
        return this;
    }

    /** 条目点击监听接口 */
    public interface OnItemClickListener<T> {

        /** 点击事件监听 */
        void onItemClick(View view, T data, int position);
    }

    /** 条目长按监听接口 */
    public interface OnItemLongClickListener<T> {

        /** 长按事件监听 */
        boolean onItemLongClick(View view, T data, int position);
    }

    /** 设置点击监听属性 */
    public void setOnItemClickListener(OnItemClickListener<T> onItemClickListener) {
        this.mOnItemClickListener = onItemClickListener;
    }

    /** 设置长按监听属性 */
    public void setOnItemLongClickListener(OnItemLongClickListener<T> onItemLongClickListener) {
        this.mOnItemLongClickListener = onItemLongClickListener;
    }
}